use swc_common::FilePathMapping;
use swc_common::{source_map::SourceMap, sync::Lrc, DUMMY_SP};
use swc_ecma_ast::*;
use swc_ecma_codegen::Config;
use swc_ecma_codegen::{text_writer::JsWriter, Emitter};
use regex::Regex;

// pub fn emit(body: Vec<ModuleItem>) -> String {
//     let module = Module {
//         span: DUMMY_SP,
//         body,
//         shebang: None,
//     };

//     let cm = Lrc::new(SourceMap::new(FilePathMapping::empty()));
//     let mut buf = vec![];
//     let mut emitter = Emitter {
//         cm: cm.clone(),
//         comments: None,
//         wr: JsWriter::new(cm, "\n", &mut buf, None),
//         cfg: Config::default()
//             .with_target(EsVersion::Es2022)
//             .with_omit_last_semi(true),
//     };

//     emitter.emit_module(&module).unwrap();

//     String::from_utf8_lossy(&buf).to_string()
// }

pub fn emit(body: Vec<ModuleItem>) -> String {
    let module = Module {
        span: DUMMY_SP, // DUMMY_SP 来自 swc_common
        body,
        shebang: None,
    };

    let cm = Lrc::new(SourceMap::new(FilePathMapping::empty())); // Lrc, SourceMap, FilePathMapping 来自 swc_common
    let mut buf = vec![];
    let mut emitter = Emitter {
        cm: cm.clone(),
        comments: None, // 假设不需要注释，或注释处理在其他地方
        wr: JsWriter::new(cm, "\n", &mut buf, None), // cm 直接传递，因为 Lrc<SourceMap> 实现了 SourceMap trait
        cfg: Config::default()
            .with_target(EsVersion::Es2022) // EsVersion 通常来自 swc_ecma_ast
            .with_omit_last_semi(true),
    };

    emitter.emit_module(&module).unwrap(); // 生成代码到 buf

    let mut output_code = String::from_utf8_lossy(&buf).to_string(); // 从 buffer 获取字符串形式的代码

    // 在此处进行替换，将 TypeScript 的 `bigint` 关键字替换为 `BigInt` 类型引用
    // 使用正则表达式确保只替换作为完整单词的 "bigint"
    let re = Regex::new(r"\bbigint\b").expect("Failed to compile bigint regex"); // 使用 expect 而非 unwrap 以提供更明确的错误信息
    output_code = re.replace_all(&output_code, "BigInt").to_string();

    output_code // 返回修改后的代码字符串
}